package xml;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import componenti.buffer.Entity;
import componenti.statistica.CoppiaIperesponenziale;
import componenti.statistica.Erlang;
import componenti.statistica.Esponenziale;
import componenti.statistica.Iperesponenziale;
import componenti.statistica.LeggeDistribuzione;
import componenti.statistica.Normale;

public class XMLWriter {
	private List<Entity> entities;
	private LeggeDistribuzione leggeProduttore;
	private LeggeDistribuzione leggeConsumatore;

	public XMLWriter(List<Entity> entities,
			LeggeDistribuzione leggeProduttore,
			LeggeDistribuzione leggeConsumatore) {
		this.entities = entities;
		this.leggeProduttore = leggeProduttore;
		this.leggeConsumatore = leggeConsumatore;
	}

	public void create(String nomeFile) {
		try {
			// Elemento radice
			Element root = new Element("simulazione");
			// Documento
			Document document = new Document(root);
			Element leggeP = new Element("legge_produttore");
			Element leggeC = new Element("legge_consumatore");

			leggeP.setText(leggeProduttore.getClass().getSimpleName());
			leggeC.setText(leggeConsumatore.getClass().getSimpleName());

			if (leggeProduttore.getClass().equals(Esponenziale.class)) {
				leggeP.setAttribute("lambda",
						((Esponenziale) leggeProduttore).getTasso() + "");
			} else if (leggeProduttore.getClass().equals(Erlang.class)) {
				leggeP.setAttribute("lambda",
						((Erlang) leggeProduttore).getTasso() + "");
				leggeP.setAttribute("numeroFunzioni",
						((Erlang) leggeProduttore).getNumeroFunzioni() + "");
			} else if (leggeProduttore.getClass()
					.equals(Iperesponenziale.class)) {

				for (CoppiaIperesponenziale c : ((Iperesponenziale) leggeProduttore)
						.getFunzioni()) {
					Element coppiaIperesponenziale = new Element(
							"Coppia_Iperesponenziale");
					coppiaIperesponenziale.setAttribute("alfa", c.getAlfa()
							+ "");
					coppiaIperesponenziale.setAttribute("lamba",
							c.getLambdaExp() + "");
					leggeP.addContent(coppiaIperesponenziale);
				}

			} else {
				leggeP.setAttribute("media",
						((Normale) leggeProduttore).getMedia() + "");
				leggeP.setAttribute("numeroFunzioni",
						((Normale) leggeProduttore).getVarianza() + "");
			}

			root.addContent(leggeP);

			if (leggeConsumatore.getClass().equals(Esponenziale.class)) {
				leggeC.setAttribute("lambda",
						((Esponenziale) leggeConsumatore).getTasso() + "");

			} else if (leggeConsumatore.getClass().equals(Erlang.class)) {
				leggeC.setAttribute("lambda",
						((Erlang) leggeConsumatore).getTasso() + "");
				leggeC.setAttribute("numeroFunzioni",
						((Erlang) leggeConsumatore).getNumeroFunzioni() + "");

			} else if (leggeConsumatore.getClass().equals(
					Iperesponenziale.class)) {

				for (CoppiaIperesponenziale c : ((Iperesponenziale) leggeConsumatore)
						.getFunzioni()) {
					Element coppiaIperesponenziale = new Element(
							"Coppia Iperesponenziale");
					coppiaIperesponenziale.setAttribute("alfa", c.getAlfa()
							+ "");
					coppiaIperesponenziale.setAttribute("lamba",
							c.getLambdaExp() + "");
					leggeC.setContent(coppiaIperesponenziale);
				}

			} else {
				leggeC.setAttribute("media",
						((Normale) leggeConsumatore).getMedia() + "");
				leggeC.setAttribute("numeroFunzioni",
						((Normale) leggeConsumatore).getVarianza() + "");
			}

			root.addContent(leggeC);

			for (Entity e : entities) {
				Element entity = new Element("entity");
				entity.setAttribute("Id", e.getID() + "");
				Element tempoInterarrivo = new Element("tempo_interarrivo");
				tempoInterarrivo.setText(e.getTempoInterarrivo() + "");
				Element tempoServizio = new Element("tempo_servizio");
				tempoServizio.setText(e.getTempoServizio() + "");
				Element tempoArrivo = new Element("istante_arrivo");
				tempoArrivo.setText(e.getIstanteArrivo() + "");
				Element tempoPartenza = new Element("istante_partenza");
				tempoPartenza.setText(e.getIstantePartenza() + "");
				Element istanteServizio = new Element("istante_servizio");
				istanteServizio.setText(e.getIstanteServizio()+ "");
				Element tempoAttesa = new Element("tempo_attesa");
				tempoAttesa.setText(e.getTempoAttesaCoda()+"");
				entity.addContent(tempoInterarrivo);
				entity.addContent(tempoPartenza);
				entity.addContent(tempoArrivo);
				entity.addContent(istanteServizio);
				entity.addContent(tempoServizio);
				entity.addContent(tempoAttesa);
				
				root.addContent(entity);
			}

			// Creazione dell'oggetto XMLOutputter
			XMLOutputter outputter = new XMLOutputter();
			// Imposto il formato dell'outputter come "bel formato"
			outputter.setFormat(Format.getPrettyFormat());
			// Produco l'output sul file ...
			outputter.output(document, new FileOutputStream(nomeFile+".xml"));
//			// Stampo l'output anche sullo standard output
//			outputter.output(document, System.out);

		} catch (IOException e) {
			System.err.println("Errore durante il parsing del documento");
			e.printStackTrace();
		}
	}
}
